﻿using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Cataloger
{
    /// <summary>
    /// Klasa opisująca kategorię statyczną
    /// Kategoria taka może być nadana dowolnemu
    /// plikowi, w przypadku nadawania katagori obiektom
    /// gromadzacym Pliki, każdy plik w danym konenerze otrzyma
    /// kategorię taką jak obiekt nadrzędny któremu przydzieliliśmy
    /// </summary>
    [Serializable]
    public class Kategoria:IKategoria
    {
		#region Fields (1) 

        

		#endregion Fields 

		#region Constructors (2) 

        public Kategoria(string naz, Color kol):this(naz)
        {
            this.Kolor = kol;
        }

        public Kategoria(string naz)
        {
            this.Nazwa = naz;
            this.Kolor = Color.Black;

        }

		#endregion Constructors 

		#region Properties (3) 

        public Color Kolor { get; set; }

        public string Nazwa { get; set; }

		#endregion Properties 

		#region Methods (4) 

		// Public Methods (2) 

        public override string ToString()
        {
            return Nazwa;
        }

        public static HashSet<Kategoria> WydobadzKategorie(Katalog katal)
        {
            HashSet<Kategoria> kategoriePas = new HashSet<Kategoria>();

            foreach (Nosnik nos in katal.Nosniki)
            {
                kats(nos.Root, ref kategoriePas);
            }
            return kategoriePas;
        }
		// Private Methods (2) 

        private static void kats(Folder f, ref HashSet<Kategoria> obiekty)
        {
            foreach (ObiektDyskowy ob in f.ObiektyDyskowe)
            {
                if (ob is Plik)
                {
                    Plik p = ob as Plik;
                    if (p.Kategoria != null)
                    {
                        obiekty.Add(p.Kategoria);
                    }
                }
                else if (ob is Folder)
                {
                    Folder fo = ob as Folder;
                    kats(fo, ref obiekty);
                }
            }



        }

          /// <summary>
          /// Metoda pomocnicza dla metody PokazPasujace
          /// </summary>
          /// <param name="f"></param>
          /// <param name="listView1"></param>
        private void SerachDir(Folder f, ref List<IObiektCatalogera> obiekty)
        {
            foreach (ObiektDyskowy ob in f.ObiektyDyskowe)
            {
                if (ob is Plik)
                {
                    Plik p=ob as Plik;
                    if (p.Kategoria!=null && p.Kategoria.Nazwa == this.Nazwa)
                    {
                        obiekty.Add(p);
                    }
                }
                else if (ob is Folder)
                {
                    Folder fo = ob as Folder;
                    SerachDir(fo,ref obiekty);
                }
            }
       
               
         
        }

		#endregion Methods 
    

        public event EventHandler ZmienionoNazwe;

        public List<IObiektCatalogera> ObiektyNalezace()
        {
            List<IObiektCatalogera> pasujacePliki = new List<IObiektCatalogera>();
            foreach (Katalog kat in Globalne.WczytaneKatalogi)
            {
                foreach (Nosnik n in kat.Nosniki)
                {
                    SerachDir(n.Root, ref pasujacePliki);
                }
            }
            return pasujacePliki;
        }

    }
}
